#include "linkqueue.h"

//1，初始化 Q是输出参数
void init_linkqueue(link_pqueue * Q)
{
	*Q = (link_pqueue)malloc(sizeof(link_queue)); //创建操作对象封装front和rear指针的
	if(*Q == NULL){
		perror("malloc");
		exit(1);
	}
	(*Q)->front = (list_pnode)malloc(sizeof(list_node)); //让front指向头节点
	if(NULL == (*Q)->front){
		perror("malloc");
		exit(1);
	}
	(*Q)->front->next = NULL; //头节点后继为空

	(*Q)->rear = (*Q)->front; //rear和front都指向头节点
}

//2，插入----入队:只能在对尾入队
//new表示新节点的指针    ,  q表示是链式队列
void in_linkqueue(link_pqueue q,list_pnode new)
{
	new->next = q->rear->next;
	q->rear->next = new;
	q->rear = q->rear->next;
}

//3，删除----出队：只能在队头出队
//   q表示是链式队列  , Data是输出参数

void out_linkqueue(link_pqueue q,datatype *Data)
{
	list_pnode t;
	//判断队列是否已空
	if(isempty_linkqueue(q)){
		printf("队列为空，无法出队!\n");
		return ;
	}
	*Data = q->front->next->data;
	t = q->front;
	q->front = t->next;
	free(t);
	
}


//4，判断栈是否为空
bool isempty_linkqueue(link_pqueue q)
{
	if(q->front == q->rear)
		return true;
	else
		return false;
}


//6，遍历栈
void show_linkqueue(link_pqueue q)
{
	list_pnode p;
	printf("---------------------------------------------------\n");
	printf("队头->");
	for(p = q->front->next; p != NULL; p = p->next)
		printf("%d->",p->data);
	printf("队尾\n");
	printf("---------------------------------------------------\n");
}
